﻿Imports System.IO
Public Class GestionarMesas
    Public Event ErrorMesa(ByVal sender As Object, ByVal e As EventArgs)
    ''' <summary>
    ''' Añade, graba, borra y modifica las mesas en el fichero
    ''' </summary>
    ''' <remarks></remarks>
    Private ruta As String = My.Application.Info.DirectoryPath
    Private _Mesas As New List(Of Mesas)

    ''' <summary>
    ''' Mesas que tenemos en nuestro sistema
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Mesas As ObjectModel.ReadOnlyCollection(Of Mesas)
        Get
            Return _Mesas.AsReadOnly
        End Get
    End Property

    ''' <summary>
    ''' Constructor que extrae las Mesas del archivo Mesas.txt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        If Not File.Exists(ruta & "\Mesas.txt") Then Exit Sub 'Comienza con la lista vacía
        Dim fichero As StreamReader = Nothing
        Try
            fichero = New StreamReader(ruta & "\Mesas.txt")
            Do Until fichero.EndOfStream
                Dim linea As String = fichero.ReadLine 'Recoge toda la línea
                Dim datos() As String = linea.Split("*")
                _Mesas.Add(New Mesas(datos(0), datos(1), Integer.Parse(datos(2))))
            Loop
        Catch ex As Exception
        Finally
            fichero.Close()
        End Try
    End Sub

    ''' <summary>
    ''' Añade las Mesas a la Lista
    ''' </summary>
    ''' <param name="mesa">Nombre mesa</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function AñadirLista(ByVal mesa As Mesas) As String
        If mesa Is Nothing OrElse mesa.Capacidad = 0 OrElse mesa.Nombre Is Nothing OrElse mesa.Descripción Is Nothing Then
            RaiseEvent ErrorMesa(mesa, New EventArgs)
            Return ""
        End If
        If _Mesas.Contains(mesa) AndAlso _Mesas.Count > 0 Then Return "La mesa " & mesa.Nombre & " ya existe."
        If mesa.Capacidad < 1 Then Return "La mesa capacidad de la mesa " & mesa.Nombre & " debe ser para mas de 1 comensal"
        _Mesas.Add(mesa)
        Return ""
    End Function

    ''' <summary>
    ''' Grabamos la lista en el archivo Mesas.txt
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Grabar() As String
        Dim fichero As StreamWriter = Nothing
        Try
            fichero = New StreamWriter(ruta & "\Mesas.txt")
            For Each mesa In _Mesas
                fichero.WriteLine(mesa.Nombre & "*" & mesa.Descripción & "*" & mesa.Capacidad)
            Next
        Catch ex As Exception
            fichero.Close()
            Return ex.Message
        Finally
            fichero.Close()
        End Try
        Return ""
    End Function

    ''' <summary>
    ''' Nos dan la Mesa que debemos agregar a la Lista
    ''' </summary>
    ''' <param name="mesa">Nombre mesa</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Añadir(ByVal mesa As Mesas) As String
        Dim men As String = AñadirLista(mesa)
        If men = "" Then Grabar()
        Return men
    End Function

    ''' <summary>
    ''' Borrar Lista Mesas
    ''' </summary>
    ''' <param name="nombre">Nombre mesa</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function BorrarMesa(ByVal nombre As String) As String
        Dim mesa As New Mesas(nombre, "", 1)
        If Not _Mesas.Contains(mesa) Then Return "No existe la mesa: " & mesa.Nombre
        mesa = _Mesas(_Mesas.IndexOf(mesa))
        _Mesas.Remove(mesa)
        Return ""
    End Function

    ''' <summary>
    ''' Borrar una Mesa
    ''' </summary>
    ''' <param name="nombre">Nombre mesa</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Borrar(ByVal nombre As String) As String
        Dim men As String = BorrarMesa(nombre)
        If men = "" Then Grabar()
        Return men
    End Function

    ''' <summary>
    ''' Modificar lista Mesas
    ''' </summary>
    ''' <param name="mesaNueva">Nombre mesa nueva</param>
    ''' <param name="nombreMesaBorrar">Nombre mesa a borrar</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ModificarMesa(ByVal mesaNueva As Mesas, ByVal nombreMesaBorrar As String) As String
        Dim mesaVieja As New Mesas(nombreMesaBorrar, "", 1)
        If mesaNueva Is Nothing OrElse mesaVieja Is Nothing Then Return "No se puede modificar"
        If Not _Mesas.Contains(mesaVieja) Then Return "No existe la mesa: " & mesaVieja.Nombre
        mesaVieja = _Mesas(_Mesas.IndexOf(mesaVieja))
        mesaVieja = mesaNueva
        Return ""
    End Function

    ''' <summary>
    ''' Modificar una Mesa
    ''' </summary>
    ''' <param name="mesaModificada">Nombre mesa modificada</param>
    ''' <param name="NombreMesaAntiguo">Nombre mesa antigua</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Modificar(ByVal mesaModificada As Mesas, ByVal NombreMesaAntiguo As String) As String
        Dim men As String = ModificarMesa(mesaModificada, NombreMesaAntiguo)
        If men = "" Then Grabar()
        Return men
    End Function
End Class
